home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 9
/
FM Towns Free Software Collection 9.iso
/
t_os
/
joke
/
iroojon
/
iroojon.bas
< prev
next >
Wrap
BASIC Source File
|
1994-11-16
|
32KB
|
1,004 lines
10 '
20 '====================================================================
30 ' >>>タウンズ 色ーヂョン v.0.0<<<
40 '====================================================================
50 '
60 ' ---このプログラムの機能---
70 ' ・ランダムな色で,"ノイズ画面","タイル画面","オープン画面"を描画する.
80 ' ・描画した画面を任意にセーブできる.(TIF形式ファイル.)
90 ' ・色情報からランダムな和音を生成し,発音する.
100 ' ・上記を,16色,256色,32768色(低解像度),の各モード画面で実行する.
110 '
120 ' ---使い方---
130 ' ・このプログラムは,Towns システムソフトウェア,または,F-BASIC386 の"V2.1以上"で
140 ' 動作します.(将来に関しては断言できないが ^^;)
150 ' ・FM音源ファイル"FMP.FMB"を,実行プログラムと同じディレクトリに置くか,または,
160 ' F-BASIC386 V2.1L10のCD-ROMを用意して,FD等から起動する.
170 ' (BASICの他のレベルに関しては未確認.)
180 ' ・操作するにはマウスが,セーブする場合はキーボードが必要です.(注:セーブ画面
190 ' からはマウスだけでは脱出できない.今後の課題です. T_T)
200 ' ・メニュー画面以外では,大抵の場合(^^;)右クリックでキャンセルできます.
210 '
220 ' ---注意点---
230 ' ・上記にもあるように,セ-ブ画面から脱出するには,"マウス&キーボードのセット"が
240 ' 必要. ぢゃないとリセットしかない.(T_T)
250 ' ・32K色のノイズ画面では,マウスの割り込みを受け付けず,キャンセルできなかったり,
260 ' 和音を鳴らしてる場合発音が変になったりすることがあります.(T_T)
270 ' この場合,何回か右クリックを続けると復旧するようです.
280 ' ・ノイズ画面で,音を鳴らしながら何回かループさせると,発音のタイミングを
290 ' 待ってから描画する,とゆー現象がありました.まあ,ノイズをループさせるの
300 ' ってあんまり意味もないので,このままにしておきます.(^^;)(もしか
310 ' すると,対処できるかも.but 〆切が・・・.)
320 ' (↑対処できたと思います.何ライン毎に発音させるかが問題だったらしい.)
330 '
340 ' *このソースの最後に,今回のプログラミングで気付いたことがまとめて有ります.
350 ' 私と同様なプログラミング初心者には面白いかもしれません.
360 '
370 '
380 ' ・・・完成日時:1994 8.14(SUN)・・・
390 ' ・・・作者:かんの-はなぢ・・・
400 '
410 '********************************************************************
420 '
430 '
440 '
450 '======================START OF PROGRAM==============================
460 '
470 ON ERROR GOTO *ERR_TRAP
480 DEFINT A-Z : RANDOMIZE TIME
490 '
500 LOAD_FMB_FLG=1 '音源ファイル読み込みエラー,判定用フラグ.(エラートラップで使う.)
510 LOAD@ "FMP.FMB"
520 LOAD_FMB_FLG=0
530 '
540 X=164 : Y=128 '基準座標
550 STR_X=64 : STR_Y=16 '文字列(の枠)の縦横の幅
560 '
570 '***以下の4つの配列は,現在のメニューのセレクト状態を保存する.***
580 DIM SCRN_MODE(2) '画面モード選択用配列
590 DIM DRW_MODE(2) '描画スタイル 〃
600 DIM LOOP_MODE(1) '繰り返し描画するかどうかの選択用配列
610 DIM SND_MODE(1) 'サウンドモード選択用配列
620 '
630 '***以下の4つの配列は,マウスの選択情報を一時的に入れておく.***
640 DIM GET_SCRN_MODE(2)
650 DIM GET_DRW_MODE(2)
660 DIM GET_LOOP_MODE(1)
670 DIM GET_SND_MODE(1)
680 '
690 '***メニューのセレクト状態の初期化***
700 SCRN_MODE(0)=1 '16色
710 DRW_MODE(0)=1 'ノイズを描画
720 LOOP_MODE(0)=1 '繰り返して描画する
730 SND_MODE(0)=1 'コードを鳴らす
740 '
750 SCREEN@ 0 : MOUSE 0
760 '
770 '
780 '************プログラム全体の流れは以下のようになっている.***********
790 '
800 GOSUB *SETTING_MENU 'メニュー描画
810 GOSUB *MAIN_GRFC '実行画面
820 GOSUB *SELECT_SAVE 'セーブするか,しないか.
830 GOSUB *ENDING
840 *ALL_END
850 PLAY OFF : MOUSE 5
860 END
870 '
880 '********************ここまで. 以下はサブルーチン.*******************
890 '
900 '
910 '
920 '********************************************************************
930 '
940 '
950 '
960 *SETTING_MENU
970 SCREEN 1,1,2,1 : GOSUB *INIT_MENU_PLT : COLOR ,0,7
980 'ページ1に描画する.あとでSCREEN 0を使うので,*MAIN_GRFCはページ0に描画
990 'して,消されるのを防ぐ.でも,別にここで2画面にしなくても・・・と気づいた
1000 'が,面倒なので,このままにしときます(T_T).
1010 '↑結局,ページ0を消す仕様になりました(T_T T_T).
1020 '
1030 FOR I=0 TO 13 'メニューの枠(?)の描画.
1040 LINE (I*3,I*3)-(639-I*3,479-I*3),PSET,%(I+1),B
1050 NEXT I
1060 '
1070 SYMBOL (X,64),"タウンズ ",2,3,,,,49 '太文字,オーバー&アンダーライン.
1080 SYMBOL STEP (160,0),"色",2,3,%1,,,1 'ランダム色で太文字.
1090 SYMBOL STEP (32,0),"ーヂョン",2,3,7,,,49
1100 '
1110 SYMBOL (X+STR_X,64+STR_Y*4)," 16色 256色 32k色",1,1
1120 SYMBOL STEP (0,STR_Y*2)," ノイズ タイル オープン",1,1
1130 SYMBOL STEP (0,STR_Y*2)," ループ シングル",1,1
1140 SYMBOL STEP (0,STR_Y*2),"SOUND ON SOUND OFF",1,1
1150 SYMBOL STEP (-STR_X,STR_Y*4),"GO! EXIT",2,2
1160 '
1170 GOSUB *SET_SCRN_MODE '現在セレクトされている項目の枠を描画する.以下同様.
1180 GOSUB *SET_DRW_MODE
1190 GOSUB *SET_LOOP_MODE
1200 GOSUB *SET_SND_MODE
1210 '
1220 '---メニュー実行部分---
1230 MOUSE 0,1 : MOUSE 1,X,Y,1 : PLAY OFF: PLAY ON
1240 END_OF_SELECT_FLG=0 'メニュー選択完了を調べるフラグ
1250 '
1260 GOSUB *M_BGM_SET 'BGMの準備.
1270 '
1280 WHILE END_OF_SELECT_FLG=0 'フラグが立つまでループ
1290 '
1300 WHILE MOUSE(3,0)=0 '左クリックされるまで待つ(WHILE MOUSE(2,0)
1310 WHILE PLAY(0)=0 'でも良いが,カーソルが,ちらつく.)
1320 GOSUB *M_BGM
1330 WEND
1340 WEND
1350 '
1360 M_X=MOUSE(4,0) : M_Y=MOUSE(5,0) '左クリックされた座標を得る
1370 '
1380 'SCRN_MODEの選択
1390 WHILE Y<=M_Y AND M_Y<=Y+STR_Y
1400 GOSUB *CHK_SLCTD_SCRN 'どの項目がクリックされたのか.
1410 GOSUB *SET_SCRN_MODE : GOTO 1730 '枠の描画 : ここの"GOTO" は
1420 WEND '(C言語の)"BREAK"に相当.
1430 '↑M_Yが変化しないので
1440 'DRW_MODEの選択 WHILEループから出られない
1450 WHILE Y+STR_Y*2<=M_Y AND M_Y<=Y+STR_Y*3
1460 GOSUB *CHK_SLCTD_DRW
1470 GOSUB *SET_DRW_MODE : GOTO 1730
1480 WEND
1490 '
1500 'LOOP_MODEの選択
1510 WHILE Y+STR_Y*4<=M_Y AND M_Y<=Y+STR_Y*5
1520 GOSUB *CHK_SLCTD_LOOP
1530 GOSUB *SET_LOOP_MODE : GOTO 1730
1540 WEND
1550 '
1560 'SND_MODEの選択
1570 WHILE Y+STR_Y*6<=M_Y AND M_Y<=Y+STR_Y*7
1580 GOSUB *CHK_SLCTD_SND
1590 GOSUB *SET_SND_MODE : GOTO 1730
1600 WEND
1610 '
1620 '選択完了?
1630 WHILE Y+STR_Y*10<=M_Y AND M_Y<=Y+STR_Y*12
1640 WHILE X<=M_X AND M_X<=X+48 'GO!
1650 END_OF_SELECT_FLG=1 : GOTO 1730
1660 WEND
1670 '
1680 WHILE X+48+STR_X*3+16<=M_X AND M_X<=X+48+STR_X*4+16 'EXIT!
1690 END_OF_SELECT_FLG=2 : GOTO 1730
1700 WEND
1710 M_X=0 : M_Y=0 'これが無いとループから出られなくなる場合がある(T_T)
1720 WEND
1730 M_X=0 : M_Y=0 '念のため(^^;)
1740 WEND '---メニュー実行部分のループの終了---
1750 '
1760 IF END_OF_SELECT_FLG=1 THEN
1770 RETURN
1780 ELSE IF END_OF_SELECT_FLG=2 THEN
1790 GOTO 830 '*ENDINGへ.
1800 ENDIF
1810 RETURN
1820 '*****THE END OF *SETTING_MENU*****
1830 '
1840 '*****以下は*SETTING_MENUから呼び出すサブルーチン*****
1850 '
1860 '---SCRN_MODE ルーチン---
1870 '
1880 *CHK_SLCTD_SCRN
1890 IF X+STR_X<=M_X AND M_X<=(X+STR_X*2-1) THEN
1900 GET_SCRN_MODE(0)=1
1910 ELSE IF (X+STR_X*2)<=M_X AND M_X<=(X+STR_X*3-1) THEN
1920 GET_SCRN_MODE(1)=1
1930 ELSE IF (X+STR_X*3)<=M_X AND M_X<=(X+STR_X*4) THEN
1940 GET_SCRN_MODE(2)=1
1950 ELSE
1960 RETURN
1970 ENDIF
1980 GOSUB *SCRN_FLGS_RESET '現在の選択状態をセットする
1990 '
2000 FOR I=0 TO 2 'フラグをゼロクリア
2010 GET_SCRN_MODE(I)=0
2020 NEXT I
2030 RETURN
2040 '
2050 '
2060 *SCRN_FLGS_RESET '前回の状態と照合する.
2070 FOR I=0 TO 2
2080 IF SCRN_MODE(I)=1 AND GET_SCRN_MODE(I)=0 THEN
2090 SCRN_MODE(I)=0 : GOTO 2120
2100 ENDIF
2110 SCRN_MODE(I)=(SCRN_MODE(I) OR GET_SCRN_MODE(I))
2120 NEXT I
2130 RETURN '---↑(1 OR 0)=1なので,それを予防する.他の場合はOK・・・のハズ---
2140 '
2150 '
2160 *SET_SCRN_MODE
2170 FOR I=0 TO 2
2180 IF SCRN_MODE(I)=1 THEN
2190 LINE (X+STR_X+STR_X*I,Y)-STEP(STR_X-1,STR_Y),PSET,,B
2200 ELSE IF SCRN_MODE(I)=0 THEN
2210 LINE (X+STR_X+STR_X*I,Y)-STEP(STR_X-1,STR_Y),PRESET,,B
2220 ENDIF
2230 NEXT I
2240 RETURN
2250 '
2260 '
2270 '---DRW_MODE ルーチン---
2280 '
2290 *CHK_SLCTD_DRW
2300 IF X+STR_X<=M_X AND M_X<=(X+STR_X*2) THEN
2310 GET_DRW_MODE(0)=1
2320 ELSE IF (X+STR_X*2)<M_X AND M_X<=(X+STR_X*3) THEN
2330 GET_DRW_MODE(1)=1
2340 ELSE IF (X+STR_X*3)<M_X AND M_X<=(X+STR_X*4) THEN
2350 GET_DRW_MODE(2)=1
2360 ELSE
2370 RETURN
2380 ENDIF
2390 GOSUB *DRW_FLGS_RESET
2400 '
2410 FOR I=0 TO 2
2420 GET_DRW_MODE(I)=0
2430 NEXT I
2440 RETURN
2450 '
2460 '
2470 *DRW_FLGS_RESET
2480 FOR I=0 TO 2
2490 IF DRW_MODE(I)=1 AND GET_DRW_MODE(I)=0 THEN
2500 DRW_MODE(I)=0 : GOTO 2530
2510 ENDIF
2520 DRW_MODE(I)=(DRW_MODE(I) OR GET_DRW_MODE(I))
2530 NEXT I
2540 RETURN
2550 '
2560 '
2570 *SET_DRW_MODE
2580 FOR I=0 TO 2
2590 IF DRW_MODE(I)=1 THEN
2600 LINE (X+STR_X+STR_X*I,Y+STR_Y*2)-STEP(STR_X-1,STR_Y),PSET,,B
2610 ELSE
2620 LINE (X+STR_X+STR_X*I,Y+STR_Y*2)-STEP(STR_X-1,STR_Y),PRESET,,B
2630 ENDIF
2640 NEXT I
2650 RETURN
2660 '
2670 '
2680 '---LOOP_MODE ルーチン---
2690 '
2700 *CHK_SLCTD_LOOP
2710 IF X+STR_X<=M_X AND M_X<=(X+STR_X*2) THEN
2720 GET_LOOP_MODE(0)=1
2730 ELSE IF (X+STR_X*3)<=M_X AND M_X<=(X+STR_X*4) THEN
2740 GET_LOOP_MODE(1)=1
2750 ELSE
2760 RETURN
2770 ENDIF
2780 GOSUB *LOOP_FLGS_RESET
2790 '
2800 FOR I=0 TO 1
2810 GET_LOOP_MODE(I)=0
2820 NEXT I
2830 RETURN
2840 '
2850 '
2860 *LOOP_FLGS_RESET
2870 FOR I=0 TO 1
2880 IF LOOP_MODE(I)=1 AND GET_LOOP_MODE(I)=0 THEN
2890 LOOP_MODE(I)=0 : GOTO 2920
2900 ENDIF
2910 LOOP_MODE(I)=(LOOP_MODE(I) OR GET_LOOP_MODE(I))
2920 NEXT I
2930 RETURN
2940 '
2950 '
2960 *SET_LOOP_MODE
2970 FOR I=0 TO 1
2980 IF LOOP_MODE(I)=1 THEN
2990 LINE (X+STR_X+STR_X*2*I,Y+STR_Y*4)-STEP(STR_X,STR_Y),PSET,,B
3000 ELSE
3010 LINE (X+STR_X+STR_X*2*I,Y+STR_Y*4)-STEP(STR_X,STR_Y),PRESET,,B
3020 ENDIF
3030 NEXT I
3040 RETURN
3050 '
3060 '
3070 '---SND_MODE ルーチン---
3080 '
3090 *CHK_SLCTD_SND
3100 IF X+STR_X<=M_X AND M_X<=(X+STR_X*2) THEN
3110 GET_SND_MODE(0)=1
3120 ELSE IF (X+STR_X*3)<=M_X AND M_X<=(X+STR_X*4) THEN
3130 GET_SND_MODE(1)=1
3140 ELSE
3150 RETURN
3160 ENDIF
3170 GOSUB *SND_FLGS_RESET
3180 '
3190 FOR I=0 TO 1
3200 GET_SND_MODE(I)=0
3210 NEXT I
3220 RETURN
3230 '
3240 '
3250 *SND_FLGS_RESET
3260 FOR I=0 TO 1
3270 IF SND_MODE(I)=1 AND GET_SND_MODE(I)=0 THEN
3280 SND_MODE(I)=0 : GOTO 3310
3290 ENDIF
3300 SND_MODE(I)=(SND_MODE(I) OR GET_SND_MODE(I))
3310 NEXT I
3320 RETURN
3330 '
3340 '
3350 *SET_SND_MODE
3360 FOR I=0 TO 1
3370 IF SND_MODE(I)=1 THEN
3380 LINE (X+STR_X+STR_X*2*I,Y+STR_Y*6)-STEP(STR_X+8,STR_Y),PSET,,B
3390 ELSE
3400 LINE (X+STR_X+STR_X*2*I,Y+STR_Y*6)-STEP(STR_X+8,STR_Y),PRESET,,B
3410 ENDIF
3420 NEXT I
3430 RETURN
3440 '
3450 '
3460 '
3470 '***実行画面用のサブルーチン***
3480 '
3490 *MAIN_GRFC
3500 PLAY OFF
3510 PALETTE : SCREEN@ 0 : CLS 'メニュー画面を消す.(コンパイルするとパレットはそのまま. T_T)
3520 SCREEN 1,0,1,0 : CLS 'ページ0に切り換える.
3530 '
3540 IF SND_MODE(0) THEN
3550 PLAY ON
3560 PLAY "L1@16","L1@16","L1@16","L1@16" '全音符で,音色をEP2.
3570 ENDIF
3580 '
3590 ON MOUSE(4) GOSUB *M_TRAP '右クリックによる割り込みを定義.
3600 MOUSE(4) ON '右クリックの割り込みを許可.クリックするとRETURN.
3610 '
3620 IF SCRN_MODE(2) THEN
3630 GOSUB *DRW_32K : GOTO 4670
3640 ELSE IF SCRN_MODE(0) THEN
3650 COL=16 : SCREEN@ 0
3660 ELSE IF SCRN_MODE(1) THEN 'グラフィック2画面モードからは,
3670 COL=256 : SCREEN 0 : SCREEN@ 2 'SCREEN 0経由で256画面に移る.
3680 ENDIF
3690 '
3700 IF SCRN_MODE(0)=1 OR SCRN_MODE(1)=1 THEN
3710 DIM PLT_1(COL-1) 'パレット内容をコピーする配列.
3720 DIM PLT_2(COL-1) '16/256画面のセーブのとき使う.
3730 DIM PLT_3(COL-1)
3740 DIM PLT_4(COL-1)
3750 ENDIF
3760 '
3770 IF SND_MODE(0) THEN '4和音を容れるための配列を宣言。
3780 DIM TONE_1(COL-1)
3790 DIM TONE_2(COL-1)
3800 DIM TONE_3(COL-1)
3810 DIM TONE_4(COL-1)
3820 ENDIF
3830 '
3840 MOUSE 0 : MOUSE 4,640,0,641,0
3850 MOUSE 1,640,0,0 '256ではカーソルが表示されるので゙MOUSE4で制限.
3860 WHILE (1) '無限ループ.右クリック割り込み or シングルモードのGOTOで脱出.
3870 '---ノイズモード---
3880 IF DRW_MODE(0) THEN 'DRW_MODEによる分岐をここから始める.
3890 GOSUB *RND_PLT
3900 FOR D_Y=0 TO 479
3910 FOR D_X=0 TO 639
3920 P=INT(RND*COL)
3930 PSET (D_X,D_Y),%P
3940 '
3950 IF SND_MODE(0) THEN
3960 IF D_X=0 AND (D_Y MOD 6=O) THEN
3970 SE_1$="N"+STR$(TONE_1(P)) '配列内の数値を文字列に
3980 SE_2$="N"+STR$(TONE_2(P)) '変換して,(MMLの)Nnの形式で
3990 SE_3$="N"+STR$(TONE_3(P)) '文字変数に代入.
4000 SE_4$="N"+STR$(TONE_4(P))
4010 PLAY SE_1$,SE_2$,SE_3$,SE_4$
4020 ENDIF
4030 ENDIF
4040 NEXT D_X
4050 NEXT D_Y
4060 '
4070 IF LOOP_MODE(1) THEN 'ループモードでなければ,ここから脱出.
4080 GOTO 4600
4090 ENDIF
4100 '
4110 '---タイルモード---
4120 ELSE IF DRW_MODE(1) THEN
4130 GOSUB *RND_PLT
4140 FOR D_Y=0 TO 464 STEP 16
4150 FOR D_X=0 TO 624 STEP 16
4160 P=INT(RND*COL)
4170 LINE (D_X,D_Y)-STEP(15,15),PSET,%P,BF
4180 '
4190 IF SND_MODE(0) THEN
4200 IF D_X=0 AND D_Y=0 THEN
4210 SE_1$="N"+STR$(TONE_1(P)) '配列内の数値を文字列に
4220 SE_2$="N"+STR$(TONE_2(P)) '変換して,(MMLの)Nnの形式で
4230 SE_3$="N"+STR$(TONE_3(P)) '文字変数に代入.
4240 SE_4$="N"+STR$(TONE_4(P))
4250 PLAY SE_1$,SE_2$,SE_3$,SE_4$
4260 ENDIF
4270 ENDIF
4280 NEXT D_X
4290 WAIT 4 'コンパイルすると早すぎるので.
4300 NEXT D_Y
4310 '
4320 IF LOOP_MODE(1) THEN
4330 GOTO 4600
4340 ENDIF
4350 '
4360 '---オープンモード---
4370 ELSE IF DRW_MODE(2) THEN
4380 GOSUB *RND_PLT : DEF PEN 0,3
4390 P=INT((RND*COL-1)+1) 'パレット0番を避けることにした.(16色だと真っ黒
4400 'になっちゃうので.)
4410 IF SND_MODE(0) THEN
4420 SE_1$="N"+STR$(TONE_1(P)) '配列内の数値を文字列に
4430 SE_2$="N"+STR$(TONE_2(P)) '変換して,(MMLの)Nnの形式で
4440 SE_3$="N"+STR$(TONE_3(P)) '文字変数に代入.
4450 SE_4$="N"+STR$(TONE_4(P))
4460 PLAY SE_1$,SE_2$,SE_3$,SE_4$
4470 ENDIF
4480 '
4490 FOR D_Y=238 TO 0 STEP -3
4500 LINE (0,D_Y)-(639,479-D_Y),PSET,%P,B
4510 NEXT D_Y
4520 '
4530 DEF PEN 0,1
4540 IF LOOP_MODE(1) THEN
4550 GOTO 4600
4560 ENDIF
4570 ENDIF 'DRW_MODEによる分岐の終わり.
4580 WEND '無限ループの終わり.
4590 '
4600 IF SCRN_MODE(1) THEN '256モードは1画面しか使えないので
4610 DIM TMP_256(153600) '配列TMP_256に画面を保存する.
4620 GET@A (0,0)-(639,479),TMP_256 'セーブする場合必要になる.
4630 SCREEN@ 0 '256画面からはSCREEN@ 0経由で
4640 ENDIF 'グラフィック2画面モードに戻る.
4650 '
4660 PLAY OFF
4670 MOUSE(4) OFF : RETURN '***THE END OF *MAIN_GRFC***
4680 '
4690 '---ランダムパレットの作成 + ランダム和音の準備---
4700 *RND_PLT
4710 '
4720 FOR I=0 TO (COL-1) 'ランダムパレット作成
4730 G=INT(RND*256)
4740 R=INT(RND*256)
4750 B=INT(RND*256)
4760 PALETTE I,[G,R,B]
4770 '
4780 IF SCRN_MODE(0)=1 OR SCRN_MODE(1)=1 THEN'パレット内容をコピーしておく.
4790 PLT_1(I)=I
4800 PLT_2(I)=G
4810 PLT_3(I)=R
4820 PLT_4(I)=B
4830 ENDIF
4840 '
4850 IF SND_MODE(0) THEN 'パレット内容から音高を得る.
4860 TONE_1(I)=I MOD 33+44 '音高44-75の範囲(32音=約2オクターブ半)内
4870 TONE_2(I)=G MOD 33+44 'に,納めるための操作.
4880 TONE_3(I)=R MOD 33+44
4890 TONE_4(I)=B MOD 33+44
4900 ENDIF
4910 '
4920 NEXT I
4930 RETURN '---*RND_PLTの終わり.---
4940 '
4950 '
4960 '---3万色モードのルーチン---
4970 *DRW_32K
4980 SCREEN@ 1 : MOUSE 1,,,0
4990 '
5000 WHILE (1) '無限ループ.右クリック or シングルモードのRETURNで脱出.
5010 '---ノイズモード---
5020 IF DRW_MODE(0) THEN
5030 FOR D_Y=0 TO 239
5040 FOR D_X=0 TO 319
5050 GOSUB *RND_32K
5060 PSET (D_X,D_Y),[G*8,R*8,B*8]
5070 '
5080 IF SND_MODE(0) THEN
5090 IF (D_Y MOD 10)=0 AND D_X=0 THEN
5100 SE_1$="N"+STR$(G+44) '(輝度(0-31)+基音高)を文字列に
5110 SE_2$="N"+STR$(R+44) '変換して,(MMLの)Nnの形式で
5120 SE_3$="N"+STR$(B+44) '文字変数に代入.
5130 PLAY SE_1$,SE_2$,SE_3$
5140 ENDIF
5150 ENDIF
5160 '
5170 NEXT D_X
5180 NEXT D_Y
5190 '
5200 IF LOOP_MODE(1) THEN
5210 RETURN
5220 ENDIF
5230 '
5240 '---タイルモード---
5250 ELSE IF DRW_MODE(1) THEN
5260 FOR D_Y=0 TO 224 STEP 16
5270 FOR D_X=0 TO 304 STEP 16
5280 GOSUB *RND_32K
5290 LINE (D_X,D_Y)-STEP(15,15),PSET,[G*8,R*8,B*8],BF
5300 '
5310 IF SND_MODE(0) THEN
5320 IF D_X=0 AND D_Y=0 THEN
5330 SE_1$="N"+STR$(G+44) '(輝度(0-31)+基音高)を文字列に
5340 SE_2$="N"+STR$(R+44) '変換して,(MMLの)Nnの形式で
5350 SE_3$="N"+STR$(B+44) '文字変数に代入.
5360 PLAY SE_1$,SE_2$,SE_3$
5370 ENDIF
5380 WAIT 1
5390 ENDIF
5400 '
5410 NEXT D_X
5420 NEXT D_Y
5430 '
5440 IF LOOP_MODE(1) THEN
5450 RETURN
5460 ENDIF
5470 '
5480 '---オープンモード---
5490 ELSE IF DRW_MODE(2) THEN
5500 GOSUB *RND_32K
5510 '
5520 IF SND_MODE(0) THEN
5530 SE_1$="N"+STR$(G+44) '(輝度(0-31)+基音高)を文字列に
5540 SE_2$="N"+STR$(R+44) '変換して,(MMLの)Nnの形式で
5550 SE_3$="N"+STR$(B+44) '文字変数に代入.
5560 PLAY SE_1$,SE_2$,SE_3$
5570 ENDIF
5580 '
5590 FOR D_Y=119 TO 0 STEP -1
5600 LINE (0,D_Y)-(319,239-D_Y),PSET,[G*8,R*8,B*8],B : WAIT 3
5610 NEXT D_Y
5620 '
5630 IF LOOP_MODE(1) THEN
5640 RETURN
5650 ENDIF
5660 ENDIF 'DRW_MODEによる分岐の終わり.
5670 WEND '無限ループの終わり.
5680 RETURN '---*DRW_32Kの終わり.---
5690 '
5700 '---3万色用ランダムカラー生成---
5710 *RND_32K
5720 MOUSE(4) ON 'ここでも許可しないと割り込まない場合がある(T_T)
5730 G=INT(RND*32) '処理がキツすぎるのかも・・・・
5740 R=INT(RND*32)
5750 B=INT(RND*32)
5760 RETURN '---*RND_32Kの終わり.---
5770 '
5780 '
5790 '
5800 '***セーブするかどうかを選択する画面のルーチン***
5810 '
5820 *SELECT_SAVE
5830 '
5840 PLAY OFF
5850 IF SCRN_MODE(2)=0 THEN '32Kモードでは配列を宣言していない.
5860 IF SND_MODE(0) THEN
5870 ERASE TONE_1,TONE_2,TONE_3,TONE_4
5880 ENDIF
5890 ENDIF
5900 '
5910 IF SCRN_MODE(0)=1 OR SCRN_MODE(2)=1 THEN '16/32K画面を保存する配列
5920 DIM TMP(76800) 'を宣言.
5930 ENDIF
5940 '
5950 SCREEN 0 'これがないとコンパイルした時パレットが初期化されない.
5960 SCREEN 1,1,3,1 'ページ1をアクティブにして両画面表示.
5970 SCREEN@ 0
5980 VIEW (255,207)-(383,271),7 '画面のほぼ中央に,
5990 WINDOW (0,0)-STEP(127,63) '128×64のウィンドウを描画.
6000 '
6010 SYMBOL (7,7),"SAVE しますか?",1,1,1
6020 SYMBOL STEP(0,32),"SAVE!",1,1,2
6030 SYMBOL STEP(72,0),"EXIT!",1,1,1
6040 '
6050 MOUSE 0,1 : MOUSE 1,318,254,1 '"SAVE!"と"EXIT!"の中間にカーソルを表示.
6060 MOUSE 4,262,246,374,262 'カーソル移動範囲を,選択範囲内に限定.
6070 '
6080 SAVE_FLAG=0 '選択判定のフラグ.
6090 '
6100 WHILE SAVE_FLAG=0
6110 WHILE MOUSE(3,0)=0
6120 WEND 'おなぢみ(^^)
6130 '
6140 M_X=MOUSE(4,0) '今回は,Y座標はMOUSE 4で限定されているので無用.
6150 '
6160 IF 262<=M_X AND M_X<=302 THEN '選択開始!
6170 SAVE_FLAG=1
6180 ELSE IF 334<=M_X AND M_X<=374 THEN
6190 SAVE_FLAG=2
6200 ENDIF
6210 '
6220 M_X=0
6230 WEND '選択判定の終わり.
6240 '
6250 '
6260 IF SAVE_FLAG=1 THEN
6270 SCREEN 1,0 'ページ0をアクティブにする.
6280 IF SCRN_MODE(0) THEN '16/32K画面を配列に保存.
6290 GET@A (0,0)-(639,479),TMP
6300 ELSE IF SCRN_MODE(2) THEN
6310 GET@A (0,0)-(319,239),TMP
6320 ENDIF
6330 '
6340 GOSUB *GO_SAVE 'セーブ画面へ.
6350 ENDIF
6360 '
6370 MOUSE(4) OFF
6380 '
6390 IF SCRN_MODE(0)=1 OR SCRN_MODE(2)=1 THEN '不要になった配列を消去.
6400 ERASE TMP
6410 ELSE IF SCRN_MODE(1) THEN
6420 ERASE TMP_256
6430 ENDIF
6440 '
6450 IF SCRN_MODE(0)=1 OR SCRN_MODE(1)=1 THEN
6460 ERASE PLT_1,PLT_2,PLT_3,PLT_4
6470 ENDIF
6480 '
6490 SAVE_FLAG=0 '念のため.
6500 SCREEN@ 0 : VIEW : WINDOW : CLS
6510 RETURN 800 '*SETTING_MENUに直接戻るとエラーが出るので行番号で戻る.
6520 '
6530 '
6540 '***セーブ実行***
6550 '
6560 *GO_SAVE
6570 SCREEN 1,0,0
6580 IF SCRN_MODE(2)=0 THEN '32K色はパレットが無い.
6590 PALETTE '初期化しないと背景色が残り,
6600 ENDIF '文字が見にくい場合がある.
6610 SCREEN@ 0 : SCREEN 0 : COLOR 7,0,7,0 : CLS
6620 CONSOLE 3,21,2
6630 '
6640 LOCATE 0,0,0
6650 PRINT " 画像をファイルにSAVEします."
6660 PRINT " マウスの右クリックの後,RETURNでキャンセルできます."
6670 '
6680 MOUSE 0 : MOUSE 4,640,0,641,0'←コンパイルするとカーソルが消えないので(T_T).
6690 MOUSE 1,640,0,0
6700 ON MOUSE(4) GOSUB *M_TRAP_2
6710 MOUSE(4) ON
6720 LOCATE 0,3,1
6730 '
6740 PRINT
6750 PRINT "ディレクトリの内容を確認しますか? [Y / N]"
6760 '
6770 GET_KY$=INPUT$(1)
6780 IF GET_KY$="N" OR GET_KY$="n" THEN
6790 GOTO *GET_FILE_NAME
6800 ELSE IF GET_KY$="Y" OR GET_KY$="y" THEN
6810 PRINT "確認したいディレクトリのパス名を入力してください."
6820 PRINT "省略すると,カレントディレクトリを表示します."
6830 LINE INPUT ">",PATH_NAME$
6840 FILES PATH_NAME$
6850 GOTO 6740
6860 ELSE
6870 GOTO 6740
6880 ENDIF
6890 '
6900 *GET_FILE_NAME '←これはサブルーチンぢゃなくて単なるラベル.
6910 PRINT
6920 PRINT "SAVEするファイル名を";
6930 COLOR 3,,,4 : PRINT "フルパス";
6940 COLOR 7,,,0 : PRINT "で入力してください.拡張子はTIFのみです."
6950 PRINT "パス名を省略すると,カレントディレクトリにセーブします."
6960 LINE INPUT ">",F_NAME$
6970 '
6980 PRINT "圧縮しますか? [Y / N]"
6990 GET_KY$=INPUT$ (1)
7000 IF GET_KY$="Y" OR GET_KY$="y" THEN
7010 ASHK=1
7020 ELSE IF GET_KY$="N" OR GET_KY$="n" THEN
7030 ASHK=0
7040 ELSE
7050 GOTO 6980
7060 ENDIF
7070 '
7080 PRINT "SAVE します." : WAIT 100 : CLS
7090 '
7100 SAVE_FLG=1 'エラー発生箇所特定用フラグ.
7110 IF SCRN_MODE(0) THEN
7120 SCREEN@ 0 : GOSUB *RE_PLT
7130 PUT@A (0,0)-(639,479),TMP
7140 SAVE@ F_NAME$,(0,0)-(639,479),1,ASHK
7150 ELSE IF SCRN_MODE(1) THEN
7160 SCREEN@ 2 : GOSUB *RE_PLT
7170 PUT@A (0,0)-(639,479),TMP_256
7180 SAVE@ F_NAME$,(0,0)-(639,479),1,ASHK
7190 ELSE IF SCRN_MODE(2) THEN
7200 SCREEN@ 1
7210 PUT@A (0,0)-(319,239),TMP
7220 SAVE@ F_NAME$,(0,0)-(319,239),0,ASHK
7230 ENDIF
7240 SAVE_FLG=0
7250 '
7260 SYMBOL (0,0),"SAVE しました!",2,2,7,,,17 '見にくい時もあるが妥協(T_T)
7270 WAIT 150
7280 SCREEN@ 0 : MOUSE(4) OFF
7290 RETURN
7300 '
7310 *RE_PLT 'パレットを復元する.
7320 FOR I=0 TO COL-1
7330 PALETTE PLT_1(I),[PLT_2(I),PLT_3(I),PLT_4(I)]
7340 NEXT I
7350 RETURN
7360 '
7370 '
7380 '***メインメニューのパレットを初期化***
7390 '
7400 *RND_PLT_2
7410 GG=INT(RND*224+32) '輝度32以上を,ランダムに得る.
7420 RR=INT(RND*223+32)
7430 BB=INT(RND*224+32)
7440 RETURN
7450 '
7460 *INIT_MENU_PLT
7470 PALETTE 0 ,[0,0,0]
7480 '
7490 FOR I=1 TO 14 'パレット番号1-14をランダムな色にする.
7500 GOSUB *RND_PLT_2
7510 PALETTE I ,[GG,RR,BB]
7520 NEXT I
7530 '
7540 PALETTE 15 ,[255,255,255]
7550 RETURN
7560 '
7570 '
7580 '***エンディング***
7590 *ENDING
7600 PLAY OFF:PLAY ON
7610 PLAY "T93V5@119L2","V5@119L2","V5@119L2","V5@119L2","V5@119L2" 'Vibe2.
7620 SCREEN@ 0 : CLS : COLOR 7,0,7,0
7630 SCREEN 1,0,3 'ページ0を32Kモードに.
7640 SCREEN@ 1 : COLOR ,7 : CLS '背景色を白でCLS.
7650 MOUSE(4) OFF : ON MOUSE(4) GOSUB *M_TRAP_3
7660 MOUSE 0 : MOUSE 4,320,0,321,0'←コンパイルするとカーソルが消えないので(T_T).
7670 MOUSE 1,,,0 : MOUSE(4) ON
7680 DMY=MOUSE (4,1) 'MOUSE(3,1)を初期化するためダミーを使う.
7690 '
7700 '
7710 L_CNT=0 : M_CNT=0 'ループ回数と,BGMを鳴らした回数.
7720 WHILE MOUSE (3,1)=0
7730 '
7740 IF L_CNT>9 AND M_CNT>3 AND PLAY(0)=0 THEN
7750 GOTO 7910
7760 ENDIF
7770 '
7780 WHILE PLAY(0)=0
7790 GOSUB *E_BGM : M_CNT=M_CNT+1
7800 WEND
7810 '
7820 FOR Y=0 TO 224 STEP 16
7830 FOR X=0 TO 304 STEP 16
7840 GOSUB *RND_32K
7850 LINE (X,Y)-(X+15,Y+15),AND,[G*8,R*8,B*8],BF : WAIT 1
7860 NEXT X
7870 NEXT Y
7880 L_CNT=L_CNT+1
7890 WEND
7900 '
7910 PLAY OFF : PLAY ON
7920 PLAY "O5@63L1" 'Watglassの音で全音符.
7930 '
7940 COLOR 7,0 :CLS
7950 SCREEN 1,1 'ページ1をアクティブ.
7960 SYMBOL (242,240), "KANNO-HANADZI / 1994",1,.5!
7970 SCREEN 1,0,3
7980 GOSUB *RND_PLT_2
7990 WAIT 80
8000 '
8010 PLAY "C+"
8020 SYMBOL (153,136),"*",1,1,[GG,RR,BB] : WAIT 150
8030 '
8040 COLOR ,0 : CLS : SCREEN 1,1,0 : CLS
8050 RETURN
8060 '
8070 '
8080 '
8090 '***エラー処理***
8100 '
8110 *ERR_TRAP
8120 IF ERR=63 AND LOAD_FMB_FLG=1 THEN
8130 PRINT "このプログラムはFM音源ファイルFMP.FMBが必要です."
8140 PRINT "実行プログラムと同じディレクトリにFMP.FMBをコピーしてください."
8150 WAIT 500
8160 PRINT "Towns MENU に戻ります." : RESUME *ALL_END
8170 '
8180 ELSE IF ERR=63 THEN 'ディレクトリ内確認の際のエラー.
8190 PRINT "指定のディレクトリにはファイルが存在しないようです."
8200 RESUME 6740 '再びディレクトリ内容を確認するのか尋ねる.
8210 '
8220 ELSE IF ERR=60 OR ERR=72 THEN
8230 PRINT "指定の入出力装置は使用できません."
8240 PRINT "指定のドライブは正しく接続されていますか?"
8250 PRINT "フロッピーディスクは挿入されていますか?"
8260 RESUME 6740
8270 '
8280 ELSE IF ERR=53 THEN
8290 PRINT "入出力装置に異常が発生しました."
8300 PRINT "フロッピーディスク等を交換してみてください."
8310 PRINT "フロッピーディスク等はフォーマットされていますか?."
8320 RESUME 6740
8330 '
8340 ELSE IF ERR=64 THEN
8350 IF SCRN_MODE(2)=0 THEN '32K色はパレットが無い.
8360 PALETTE '初期化しないと背景色が残り,
8370 ENDIF '文字が見にくい場合がある.
8380 SCREEN@ 0 : SCREEN 0 : COLOR 7,0,7,0 : CLS
8390 '
8400 PRINT "指定のファイルはすでに存在しています."
8410 PRINT "上書きしてもいいですか? [Y / N]"
8420 GET_KY$=INPUT$ (1)
8430 IF GET_KY$="Y" OR GET_KY$="y" THEN
8440 KILL F_NAME$
8450 RESUME 7080 'セーブのやり直し.
8460 ELSE
8470 LINE INPUT "別のファイル名をフルパスで指定してください. >",F_NAME$
8480 RESUME 7080
8490 ENDIF
8500 '
8510 ELSE IF ERR=65 OR ERR=67 THEN
8520 IF SCRN_MODE(2)=0 THEN
8530 PALETTE
8540 ENDIF
8550 SCREEN@ 0 : SCREEN 0 : COLOR 7,0,7,0 : CLS
8560 '
8570 PRINT "指定のディレクトリに空き領域がありません."
8580 PRINT "不要なファイルを削除するか,別のディレクトリにセーブしてください."
8590 PRINT
8600 PRINT "注意!"
8610 PRINT "上記にもかかわらず,指定したディレクトリ内に,指定したファイル名で"
8620 PRINT "書き込まれている場合があります.確認してみてください."
8630 PRINT "そのファイルは";
8640 COLOR 3,,,4 : PRINT "TIF形式ファイルではない,変なファイル";
8650 COLOR 7,,,0 : PRINT "です."
8660 PRINT "削除しちゃってください(^^;)"
8670 RESUME 6740
8680 '
8690 ELSE IF ERR=73 THEN
8700 IF SCRN_MODE(2)=0 THEN
8710 PALETTE
8720 ENDIF
8730 SCREEN@ 0 : SCREEN 0 : COLOR 7,0,7,0 : CLS
8740 '
8750 PRINT "指定されたディスクは書き込みが禁止されています."
8760 RESUME 6740
8770 '
8780 ELSE IF (ERR=2 AND SAVE_FLG=1) OR (ERR=5 AND SAVE_FLG=1) THEN
8790 'ERR 2はインタプリタ,ERR 5はコンパイルしたもので出る,ようだ.
8800 IF SCRN_MODE(2)=0 THEN
8810 PALETTE
8820 ENDIF
8830 SCREEN@ 0 : SCREEN 0 : COLOR 7,0,7,0 : CLS
8840 '
8850 PRINT "ファイル名が正しくない可能性があります."
8860 PRINT "もう一度正確にフルパスで入力してみてください."
8870 RESUME 6740
8880 '
8890 ELSE IF ERR=55 THEN
8900 IF SCRN_MODE(2)=0 THEN
8910 PALETTE
8920 ENDIF
8930 SCREEN@ 0 : SCREEN 0 : COLOR 7,0,7,0 : CLS
8940 '
8950 PRINT "ファイル名が正しくありません."
8960 PRINT "もう一度正確にフルパスで入力してみてください."
8970 RESUME 6740
8980 '
8990 ELSE
9000 IF SCRN_MODE(2)=0 THEN
9010 PALETTE
9020 ENDIF
9030 SCREEN@ 0 : SCREEN 0 : COLOR 7,0,7,0 : CLS
9040 '
9050 PRINT "何らかのエラーが発生しました."
9060 PRINT "エラー番号=";ERR
9070 PRINT "行番号=";ERL
9080 WAIT 500
9090 PRINT "Towns MENU に戻ります. すみません. m(_ _)m"
9100 RESUME *ALL_END
9110 ENDIF
9120 '
9130 '---エラー処理の終わり---
9140 '
9150 '
9160 '***BGM関連ルーチン***
9170 '
9180 '---メニュー用BGM---
9190 *M_BGM_SET '急いで考えたんで変数の使い方が変(T_T).
9200 M$(0)="L16B->FB->CQ3FGRFQ8R2"
9210 M$(1)="<<A>EA>CQ3FGRFQ8R2"
9220 M$(2)="<<G>DGB->Q3FGRFQ8R2"
9230 M$(3)="<<F>CFGA>C8Q3ERFRGRQ8AR8<<"
9240 '
9250 MELO$=M$(0)+M$(1)+M$(2)
9260 '
9270 M$(4)=MELO$+M$(3)
9280 M$(5)=MELO$+"<<F>CFGA>C8Q3ERFRGQ8<<"
9290 M$(6)=MELO$+"<<F>CFGA>C8Q3EQ8<<"
9300 M$(7)=MELO$+"<<F>CFG<"
9310 '
9320 PLAY "T100@118%C","@118%LV6","@118%RV4","@118%LV2" 'Marimba2の音.
9330 RETURN
9340 '
9350 '
9360 *M_BGM
9370 PLAY M$(4),"R4"+M$(5),"R2"+M$(6),"R2R4"+M$(7)
9380 RETURN
9390 '
9400 '
9410 '---エンディング用BGM---
9420 '
9430 *E_BGM
9440 '
9450 PLAY "DC<AB-&B-1>",">DC<AB-&B-1",">FECD&D1<",">B-AEF&F1<",">>FECD&D1<<"
9460 RETURN
9470 '
9480 '
9490 '
9500 '---マウス右クリック割り込みルーチン---
9510 *M_TRAP '実行画面での割り込み発生で,ここに来る.
9520 RETURN 4600 '*MAIN_GRFCの終わりに戻る=*MAIN_GRFCを脱出する.
9530 '
9540 *M_TRAP_2 'セーブ画面での割り込みで,ここに来る.
9550 RETURN 6370 '*SELECT_SAVEの終わりに戻る=メインメニューへ戻る.
9560 '
9570 *M_TRAP_3 'エンディングをキャンセルする場合,ここに来る.
9580 RETURN 8040
9590 '
9600 '
9610 '
9620 '====================THE END OF PROGRAM==============================
9630 '
9640 '
9650 '
9660 '
9670 '********************************************************************
9680 '
9690 ' ・今回のプログラミングにおける教訓!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
9700 '
9710 ' ・いろんな画面モードを切り換えて使う場合は,画面遷移に関して常に
9720 ' 意識的でないとあかん!
9730 '
9740 ' ・256モード画面とグラフィック2画面モードは,直接行き来できない!
9750 ' 256 > SCREEN@ 0 > 2画面
9760 ' 2画面 > SCREEN 0 > 256
9770 '
9780 ' ・パレットを確実に初期化したい場合は, "SCREEN 0 : SCREEN@ 0" で行う!
9790 ' インタプリタは見逃してくれてもコンパイラはキビシー!(単に,私の頭が未熟者だ
9800 ' とゆー可能性もある. T_T)
9810 '
9820 ' ・PLAY命令は,きっちり管理しないとマウス割り込みに影響があるようだ.
9830 ' (ちがうかもしれない・・・)
9840 '
9850 ' ・SCREEN 関連の命令の前に,PLAY命令(のテンポとかオクターブの設定部分?)を
9860 ' 置かないと,発音が遅れるよーだ.(他のことが原因かもしれないが・・・)
9870 '
9880 ' ・MOUSE (3,*)命令は,MOUSE 0 では初期化されない(らしい).
9890 ' (MOUSE (4,*) or MOUSE (5,*)で初期化できる.)
9900 '
9910 ' ・MOUSE 1 でカーソルを表示しないように設定しても,コンパイラは無視する(ようだ)
9920 '
9930 ' ・フラグ等のチェックは"WHILE"より"IF"を使うべき!
9940 ' (WHILEだと"GOTO"とかでループから強制脱出するしかない(ようだ ^^;).)
9950 '
9960 ' ・ファイルディスクリプタの記述は,カレントディレクトリから読み込みたい場合は "\"を
9970 ' 先頭に付けてはいけない.(音源ファイルの読み込み等)
9980 '
9990 ' *まあ,こんなとこですかね. でわ.
10000 '
10010 '
10020 '
10030 '====================================================================